/*->c.vtcon */

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <signal.h>
#include <ctype.h>
#include <time.h>

#include "h.os"
#include "h.wimp"



#include "h.wos"
#include "h.main"
#include "h.ram"
#include "h.mym"
#include "h.pr"


#include "h.def"
#include "h.tek"
#include "h.term"

#include "h.vtdef"
#include "h.vtscr"
#include "h.vtfile"
#include "h.vtprint"
#include "h.vtsend"
#include "h.vtact"
#include "h.vtlo"
#include "h.vtchar"

#include "h.vtcon"





void ttnsc(byte) int byte;
{
 switch(byte)
  {
   case  9:
           cursorforward(1);
           break;

   case 11:
           reverseindex();
           break;      
  }
}




void concodes(int byte)
{
 switch(byte)
  {
   case   7:
            if(vtbeep) beep();
            break;

   case  13: 
            carriagereturn();
            if(!spconcode && spoolflag) myspool(13);
            if(autoprint) printprint(13);
            if(rxcrlnf)
            {
             byte=newlinemode;
             newlinemode=0;
             concodes(10);
             newlinemode=byte;
            }
            break;

   case   8: /*left if in col. 1 don't move */
            cursorback(1);
            if(destbkspc) setspc(1);
            break;

   case   9: /*go next tab or far right */
            if(ttns) ttnsc(9);
            else     dotab(1);
            break;

   case SUB: /* = CAN but display reverse ? */
            flagset();
            break;

   case CAN: /* display del, cancel ESC sequence */
            flagset();
            break;

   case ENQ:
            answerback();
            break;

   case ESC:
            escflag=1;
            break;

   case  12: /* form feed */
            if(escflag && tekopen) 
            {
             teksetfocusfront();
             break;
            }
            if(ansisys) 
            {
             clearscrhome(VTCBACK);
             break;
            }

   case  11:
            if(ttns && byte==11)
            {
             ttnsc(11);
             break;
            }

   case  10: /* line feed */
             /* VT */
             /* new line or line feed depends on new line mode */
            if(!spconcode && spoolflag) myspool(10);
            if(autoprint)
            {
             if(byte==12) printprint(12);
             else         printprint(10);
            }
            index();
            if(newlinemode) concodes(13);
            break;

   case  15: /* G0 character set selected */
   case  14: /* G1 character set selected */
            vtgl=15-byte;
            break;

    default:
            if(ansisys) printable(byte);
            /* ignore the rest */
            break;
  }
}




/*****************************************************************************/
                                 /* TTY */





void tty80(int byte)
{ 
 switch(byte)   
 {
  case  -1:
           return;
  
  case  CR:
           carriagereturn();
           if(rxcrlnf)   tty80(10);
           if(!spconcode && spoolflag) myspool(byte);
           if(autoprint)               printprint(byte);
           break;

  case DEL:
           tty80(8);
           tty80(32);
 
  case  BS:
           ttleft();
           break;

  case  HT:
           ttright();
           break;

   case VT:
           reverseindex();
           break;

  case  LF:
           index();
           if(!spconcode && spoolflag) myspool(byte);
           if(autoprint)               printprint(byte);
           break;

  case BEL:
           beep();
           break;

  case  FF:
           clearscrhome(VTFXNONE);
           break;

  case  RS:
           home();
           break;

   default:
           if(!spconcode && spoolflag) myspool(byte);
           if(byte>31)
           {
            writechar(byte,ttyx,ttyy);
            if(autoprint) printprint(byte);
            ttright();
           }
 }
}











/*****************************************************************************/
                                  /* VT 52 */

int y_flag;
int y_line;


void ycodes(int byte)
{
 switch(y_flag)
  { 
   case  1:
           y_line=byte-0x1F;
           y_flag+=1;
           break;

   case  2:
           cursorxyns(byte-0x1F-1,y_line-1);
           y_flag=0;
           break;
  }
}



void vt52esc(int byte)
{
 escflag=0;
 switch(byte)
  { 
   case 'A': /*cursor up*/
            cursorupns(1);
            break;      

   case 'B': /*cursor down*/
            cursordownns(1);
            break;      

   case 'C': /*cursor right*/
            cursorforward(1);
            break;      

   case 'D': /*cursor left*/
            cursorback(1);
            break;     

   case 'E': /*nothing*/
            break;       

   case 'F': /* enter vt52 graphics */
            vtgn[vtgl]=VTSPECGR;
            break;

   case 'G': /* exit vt52 graphics */
            vtgn[vtgl]=VTASCII;
            break;   

   case 'H': /* home cursor */
            home();
            break;
                        
   case 'I': /*reverse linefeed*/
            reverseindexns();       
            break;                         

   case 'J': /*erase to end of page*/
            eraseeop(VTFXNONE);
            break;
             
   case 'K': /*erase to end of line*/
            eraseeol(VTFXNONE);
            break;             
   case 'Y':
            y_flag=1;
            break;

   case 'Z': /*Identify*/
            sendidentify();
            break;
                        
   case '=': /*enter alternate key mode*/
            altkey=1;
            break;
                        
   case '>': /*exit  alternate key mode*/
            altkey=0;
            break;
              
   case '<': /*enter ansi mode*/
            /* vtboot(); */
            ansimode=1;
            break;           

   case '^': /* enter autoprint mode */
            setprint(&autoprint,1);
            break;

   case '-': /* exit autoprint mode  */
            setprint(&autoprint,0);
            break;

   case 'W': /* enter printer controller mode */
            setprint(&conoprint,1);
            printconboot();
            break;

   case 'X': /* exit printer controller mode */
            setprint(&conoprint,0);
            break;

   case ']': /* print screen */
            printscreen();
            break;

   case 'V': /* print cursor line */
            printcursor();
            break;
  }
}




void vt52(int byte)
{
 if(ttymode)   tty80(byte);
 else
 if(y_flag)    ycodes(byte);
 else
 if(escflag)   vt52esc(byte);
 else   
 if(byte<32)   concodes(byte);
 else          printable(byte);
}


